<?php
class ManagerController extends Sosweb_Controller_Action
{
	function init()
	{
		parent::init();
		$this->logger->info('Inicjalizacja strony zarządzania kuponami profitmania.pl przez uzytkownika z IP: '.$_SERVER['REMOTE_ADDR']);
		
		$this->_helper->layout()->getView()->headTitle('ProfitMania.pl - Zarabiaj na zakupach - '.Sosweb_Const_DescriptionConst::$TITLE_1, 'SET');
		$this->_helper->layout()->getView()->getHelper('HeadMeta')->appendName('description', Sosweb_Const_DescriptionConst::$DESC_1);		
	}

	function indexAction()
	{
	}
	
	function addAction()
	{
		$this->view->pageHeader = Sosweb_Const_ProfitmaniaConst::$PAGE_HEADER_ADD_COUPON;		
		
		$request = clone $this->getRequest();
		
		//tworzenie formularza
		$form = $this->getAddCouponForm();
		
		if ($request->isPost())
		{
			if (!$form->isValid($request->getPost())) 
			{	
				$this->view->couponForm = $form;
				
				return;
			}
			else
			{
				$form_data = $form->getValues();
				$coupon_data = Sosweb_Util_Common_ArrayFilter::partial($form_data, null, array('save_button', 'discard_button', 'password', 'id', 'form_id', 'token'));
				
				//sprawdzenie tokenu
				$session = $this->getSession('coupon');
				
				if ($form_data['token'] == $session->token)
				{
					//sprawdzenie czy podano wlasciwe haslo do zapisania danych o kuponie
					if ($form_data['password'] == Sosweb_Const_ProfitmaniaConst::$COUPON_PASSWORD)
					{
						//wypełnienie pustych pól wartościami domyślnymi oraz standaryzacja url
						$coupon_data = $this->processValues($coupon_data);
						
						$this->logger->info('Zapis nowego kuponu do bazy danych: '.print_r($coupon_data, true));
						$coupons_table = new Coupons();
						$newCouponId = $coupons_table->insert($coupon_data);
						
						$this->logger->info('Dodano kupon o identyfikatorze '.$newCouponId);
						$message = 'Dodano kupon rabatowy o identyfikatorze '.$newCouponId.'.';
						$this->view->message = $message;

						//czyszczenie tokena
						Zend_Session::namespaceUnset('coupon');
						
						return $this->_forward('index', 'Manager');
					}
					else
					{
						$form->setDescription("Nieprawidłowe hasło do zapisu nowego kuponu.");
						$this->view->couponForm = $form;
						
						return;					
					}					
				}
				else
				{
					$this->logger->info('Brak danych o tokenie w sesji.');
					$message = 'Brak danych o tokenie w sesji. Kupon dla tych danych został już zapisany w bazie danych.';
					$this->view->message = $message;
					        						
					return $this->_forward('index', 'Manager');					
				}
			}
		}
		else
		{
			$session = $this->getSession('coupon');
			$session->token = mt_rand(10000, 1000000);
			$form->setDefault('token', $session->token);
			
			$this->view->couponForm = $form;
		}		
	}
	
	function deleteAction()
	{
		$this->view->pageHeader = Sosweb_Const_ProfitmaniaConst::$PAGE_HEADER_DELETE_COUPON;		
			
		$request = clone $this->getRequest();		
		
		if ($request->isPost())
		{
			$form = $this->getDeleteCouponForm();
			
			if (!$form->isValid($request->getPost())) 
			{	
				$this->view->deleteForm = $form;
				
				return;
			}
			else
			{
				$form_data = $form->getValues();
				
				if ($form_data['password'] == Sosweb_Const_ProfitmaniaConst::$COUPON_PASSWORD)
				{
					$this->logger->info('Usunięcie kuponu o identyfikatorze: '.$form_data['id'].' '.print_r($form_data, true));
					
					$where = 'id = '.$form_data['id'];						
					$coupons_table = new Coupons();
					$affected_rows = $coupons_table->delete($where);
					
					if ($affected_rows > 0)
					{
						$this->logger->info('Usunięto dane kuponu o identyfikatorze '.$form_data['id']);
						$message = 'Usunięto dane kuponu o identyfikatorze '.$form_data['id'].'. ';
					}
					else
					{
						$this->logger->info('Nie znaleziono kuponu o identyfikatorze '.$form_data['id']);
						$message = 'Nie znaleziono kuponu o identyfikatorze '.$form_data['id'].'.';
					}
					
					$this->view->message = $message;
					        						
					return $this->_forward('index', 'Manager');
				}
				else
				{
					$form->setDescription("Nieprawidłowe hasło do usunięcia nowego kuponu.");
					$this->view->deleteForm = $form;
					
					return;					
				}
			}
		}
		else
		{
			$form = $this->getDeleteCouponForm();
			$this->view->deleteForm = $form;
		}
	}	
	
	function editAction()
	{
		$this->view->pageHeader = Sosweb_Const_ProfitmaniaConst::$PAGE_HEADER_EDIT_COUPON;		
		
		$request = clone $this->getRequest();		
		
		if ($request->isPost())
		{
			//na podstawie id formularza okreslamy z kad przyszly dane formularza (id, edit)
			$form_id = $request->getParam('form_id'); 
			
			if ($form_id == '1') //zgloszenie od formularza ID
			{
				$form = $this->getEditIdCouponForm();
				
				if (!$form->isValid($request->getPost())) 
				{	
					$this->view->idForm = $form;
					
					return;
				}
				else
				{
					//wskazane id kuponu do edycji
					$coupon_id = $form->getValue('id'); 
					//formularz edycji kuponu
					$form = $this->getEditCouponForm();
					//pobranie danych dla wybranego id kuponu
					$coupons_table = new Coupons();
					$select = $coupons_table->select();
					$select->where('id = ?', $coupon_id);
					
				    try
			       	{
			       		$this->logger->info('Fetching coupon data for id '.$coupon_id.'. '.$select->assemble());
						$row = $coupons_table->fetchRow($select);
						
						if($row == null)
						{
							$this->logger->warn('Nie znaleziono kuponu o podanym identyfikatorze '.$coupon_id.'.');
							$this->view->message = 'Nie znaleziono kuponu o podanym identyfikatorze '.$coupon_id.'.';
							
							return;
						}
						else
						{
							$form->populate($row->toArray());
						}
			       	}
					catch(Zend_Exception $ex)
					{
						$this->logger->error($ex->getMessage());
						$this->view->message = 'Błąd podczas pobierania dostępnych kategorii kuponów.';
						
						return $this->_forward('index', 'Manager');
					}
					
					$this->view->couponForm = $form;
					$this->view->idForm = null;
					
					return;
				}
			}
			else //zgloszenie od formularza EDIT
			{
				$form = $this->getEditCouponForm();
				
				if (!$form->isValid($request->getPost())) 
				{	
					$this->view->couponForm = $form;
					
					return;
				}
				else
				{
					//aktualizacja danych w bazie
					$form_data = $form->getValues();
					$coupon_data = Sosweb_Util_Common_ArrayFilter::partial($form_data, null, array('save_button', 'discard_button', 'password', 'id', 'form_id', 'token'));
	
					//sprawdzenie czy podano wlasciwe haslo do zapisania danych o kuponie
					if ($form_data['password'] == Sosweb_Const_ProfitmaniaConst::$COUPON_PASSWORD)
					{
						//wypełnienie pustych pól wartościami domyślnymi oraz standaryzacja url
						$coupon_data = $this->processValues($coupon_data);
												
						$this->logger->info('Aktualizacja danych kuponu o identyfikatorze: '.$form_data['id'].' '.print_r($coupon_data, true));
						
						$where = 'id = '.$form_data['id'];						
						$coupons_table = new Coupons();
						$affected_rows = $coupons_table->update($coupon_data, $where);
						
						if ($affected_rows > 0)
						{
							$this->logger->info('Edytowano dane kuponu o identyfikatorze '.$form_data['id']);
							$message = 'Edytowano dane kuponu o identyfikatorze '.$form_data['id'].'.';
						}
						else
						{
							$this->logger->info('Nie znaleziono kuponu o identyfikatorze '.$form_data['id']);
							$message = 'Nie znaleziono kuponu o identyfikatorze '.$form_data['id'].'.';
						}
						
						$this->view->message = $message;
						        						
						return $this->_forward('index', 'Manager');
					}
					else
					{
						$form->setDescription("Nieprawidłowe hasło do zapisu nowego kuponu.");
						$this->view->couponForm = $form;
						
						return;					
					}
				}
			}
		}
		else
		{
			//jezeli nie jest to post to pokazujemy wybor identyfikatora kuponu do edycji
			$form = $this->getEditIdCouponForm();
			$this->view->idForm = $form;
					
			return;
		}
	}	
	
	private function getAddCouponForm()
	{
		//pobranie zdefiniowanych kategorii kuponów
		$coupon_categories_table = new CouponCategories();
		$select = $coupon_categories_table->select();
		$select->order('id');
		
	    try
       	{
       		$this->logger->info('Fetching coupon categories. '.$select->assemble());
			$rows = $coupon_categories_table->fetchAll($select);
			
			if(count($rows)== 0)
			{
				$this->logger->warn('Nie znaleziono zdefiniowanch kategorii kuponów.');
			}
			
			$categories_values = array();
			$categories_keys = array();
			
			foreach ($rows as $k=>$v)
			{	
				array_push($categories_keys, $v->id);
				array_push($categories_values, $v->category);
			}
			
			$categories = array_combine($categories_keys, $categories_values);			
       	}
		catch(Zend_Exception $ex)
		{
			$this->logger->error($ex->getMessage());
			$this->view->message = 'Błąd podczas pobierania dostępnych kategorii kuponów.';
			
			return $this->_forward('index', 'Manager');
		}
				
		$form = new Sosweb_View_Form_CouponForm();
		$form->createForm('add', $categories);
		$form->setAction($this->view->baseUrl.'/Manager/add')
			->setMethod('post');
			
		return $form;	
	}
	
	private function getEditCouponForm()
	{
		//pobranie zdefiniowanych kategorii kuponów
		$coupon_categories_table = new CouponCategories();
		$select = $coupon_categories_table->select();
		$select->order('id');
		
	    try
       	{
       		$this->logger->info('Fetching coupon categories. '.$select->assemble());
			$rows = $coupon_categories_table->fetchAll($select);
			
			if(count($rows)== 0)
			{
				$this->logger->warn('Nie znaleziono zdefiniowanch kategorii kuponów.');
			}
			
			$categories_values = array();
			$categories_keys = array();
			
			foreach ($rows as $k=>$v)
			{	
				array_push($categories_keys, $v->id);
				array_push($categories_values, $v->category);
			}
			
			$categories = array_combine($categories_keys, $categories_values);			
       	}
		catch(Zend_Exception $ex)
		{
			$this->logger->error($ex->getMessage());
			$this->view->message = 'Błąd podczas pobierania dostępnych kategorii kuponów.';
			
			return $this->_forward('index', 'Manager');
		}
				
		$form = new Sosweb_View_Form_CouponForm();
		$form->createForm('edit', $categories);
		$form->setAction($this->view->baseUrl.'/Manager/edit')
			->setMethod('post');
			
		return $form;	
	}
	
	private function getEditIdCouponForm()
	{
		$form = new Sosweb_View_Form_IdForm();
		$form->createForm();
		$form->setAction($this->view->baseUrl.'/Manager/edit')
			->setMethod('post');
			
		return $form;	
	}
	
	private function getDeleteCouponForm()
	{
		$form = new Sosweb_View_Form_DeleteForm();
		$form->createForm();
		$form->setAction($this->view->baseUrl.'/Manager/delete')
			->setMethod('post');
			
		return $form;	
	}	
	
	private function processValues(array $coupons_data)
	{
		$current_date = date('Y-m-d');
		
		if (trim($coupons_data['posted_date']) == '')
			$coupons_data['posted_date'] = $current_date;

		if (trim($coupons_data['expiry_date']) == '')
			$coupons_data['expiry_date'] = '9999-12-31';

		if (trim($coupons_data['t_link']) != '' && !Sosweb_Util_Common_String::startsWith($coupons_data['t_link'], 'http://'))	
			$coupons_data['t_link'] = 'http://'.$coupons_data['t_link'];
			
		if (trim($coupons_data['c_link']) != '' && !Sosweb_Util_Common_String::startsWith($coupons_data['c_link'], 'http://'))	
			$coupons_data['c_link'] = 'http://'.$coupons_data['c_link'];			
						
		return $coupons_data;
	}
}